package paquete;

/** Pieza Rey **/
// clase que hereda de pieza e implementa la interfaz movimiento
public class rey extends pieza implements movimiento{

	@SuppressWarnings("unused")
	private boolean jaque;
	private static int[] jaquexy = { 0, 0 };

	// constructor
	public rey(char caracter, int posx, int posy, int maxx, int maxy,
			int color, boolean espieza) {
		super(caracter, posx, posy, maxx, maxy, color, espieza);
	}

	public void setJaque(boolean jaque) {
		this.jaque = jaque;
	}

	public int[] getJaquexy() {
		return rey.jaquexy;
	}

	// movimientos validos para el rey
	@Override
	public boolean movimientosvalidos(int x1, int y1, int x2, int y2,
			pieza[][] tablero, boolean jaque, int contador, int turno) {

		//se verifica las conidiciones establecidas en la clase pieza 
		//de la cual esta heredando rey
		if (!super.movimientosvalidos(x1, y1, x2, y2, tablero, jaque, contador,
				turno))
			return false;

		if (Math.abs(x1 - x2) <= 1 && Math.abs(y1 - y2) <= 1)
			return true;

		return false;
	}

	// metodo que verifica si el rey esta en jaque o no
	public static boolean enjaque(int x, int y, tablero Tablero, int turno,
			boolean esrey, boolean checkpeon) {
		int s1 = 0;
		int s2 = 0;
		int numero = 0;

		boolean xpeon1 = x < 8 ? true : false;
		boolean xpeon2 = x > 1 ? true : false;
		boolean ypeon1 = y < 8 ? true : false;
		boolean ypeon2 = y > 1 ? true : false;

		if (turno == tablero.BLANCO) {
			// verificacion de peones negros arriba a la derecha
			if (esrey) {
				jaquexy[0] = x + 1;
				jaquexy[1] = y + 1;
			}
			if (!checkpeon)
				if (checkpieza(x + 1, y + 1, Tablero, turno, xpeon1 && ypeon1))
					if (turno != Tablero.getPieza(x + 1, y + 1).getcolor())
						return true;

			// verificacion de peones negros arriba a la izquierda
			if (esrey) {
				jaquexy[0] = x - 1;
				jaquexy[1] = y + 1;
			}
			if (!checkpeon)
				if (checkpieza(x - 1, y + 1, Tablero, turno, xpeon2 && ypeon1))
					if (turno != Tablero.getPieza(x - 1, y + 1).getcolor())
						return true;

			if (checkpeon && y + 1 == 3)
				if (checkpieza(x, y + 1, Tablero, turno, xpeon2 && ypeon1))
					if (turno != Tablero.getPieza(x, y + 1).getcolor())
						return true;
			if (checkpeon && y + 2 == 4)
				if (checkpieza(x, y + 2, Tablero, turno, xpeon2 && ypeon1))
					if (turno != Tablero.getPieza(x, y + 2).getcolor())
						return true;

		} else {
			// verificacion de peones blancos abajo a la derecha
			if (esrey) {
				jaquexy[0] = x + 1;
				jaquexy[1] = y - 1;
			}
			if (!checkpeon)
				if (checkpieza(x + 1, y - 1, Tablero, turno, xpeon1 && ypeon2))
					if (turno != Tablero.getPieza(x + 1, y - 1).getcolor())
						return true;
			// verificacion de peones blancos abajo a la izquierda
			if (esrey) {
				jaquexy[0] = x - 1;
				jaquexy[1] = y - 1;
			}
			if (!checkpeon)
				if (checkpieza(x - 1, y - 1, Tablero, turno, xpeon2 && ypeon2))
					if (turno != Tablero.getPieza(x - 1, y - 1).getcolor())
						return true;

			if (checkpeon && y - 1 == 6)
				if (checkpieza(x, y - 1, Tablero, turno, xpeon2 && ypeon1))
					if (turno != Tablero.getPieza(x, y - 1).getcolor())
						return true;
			if (checkpeon && y - 2 == 5)
				if (checkpieza(x, y - 2, Tablero, turno, xpeon2 && ypeon1))
					if (turno != Tablero.getPieza(x, y - 2).getcolor())
						return true;
		}

		//
		for (int j = 0; j <= 7; j++) {

			if (j == 0) {
				numero = Math.abs(y - 8);
				s1 = 0;
				s2 = 1;
			}
			if (j == 1) {
				numero = 8 - numero - 1;
				s2 = s2 * -1;
			}
			if (j == 2 || j == 5) {
				numero = Math.abs(x - 8);
				s1 = 1;
				s2 = 0;
			}

			if (j == 3) {
				numero = 8 - numero - 1;
				s1 = s1 * -1;
			}
			
			if (j >= 4) {
				numero = 8;
				s1 = j == 5 ? -1 : 1;
				s2 = j == 7 ? -1 : 1;
				if (j == 7)
					s1 = -1;
			}

			// cordenada XY positivo negativo
			for (int i = 1; i <= numero; i++) {
				if (esrey) {
					jaquexy[0] = x + i * s1;
					jaquexy[1] = y + i * s2;
				}
				if (x + i * s1 > 8 || x + i * s1 < 0 || y + i * s2 > 8
						|| y + i * s2 < 0)
					break;
				if (checkpieza(x + i * s1, y + i * s2, Tablero, turno, true)) {
					if (!esrey)
						if (turno != Tablero.getPieza(x + i * s1, y + i * s2)
								.getcolor()
								&& Tablero.getPieza(x + i * s1, y + i * s2) instanceof rey
								&& Math.abs((x + i * s1) - x) <= 1
								&& Math.abs((y + i * s1) - y) <= 1)
							break;
					
					if (turno != Tablero.getPieza(x + i * s1, y + i * s2)
							.getcolor()
							&& checkCaracter(
									Tablero.getPieza(x + i * s1, y + i * s2)
											.getcaracter(), j))
						return true;
					break;
				}
			}

			
		}
		
		return false;
	}

	//metodo que chequea se la coordenada xy posee una pieza
	private static boolean checkpieza(int x, int y, tablero Tablero, int turno,
			boolean condicion) {

		if (!condicion)
			return false;

		if (Tablero.getPieza(x, y).getespiza())
			return true;

		return false;
	}
	
	//metodo que chequea el caracter de una pieza
	private static boolean checkCaracter(char caracter, int modo) {

		if (caracter == '♕' || caracter == '♛')
			return true;

		if (modo <= 3) {
			if (caracter == '♖' || caracter == '♜')
				return true;
		} else if (caracter == '♗' || caracter == '♝')
			return true;

		return false;
	}

}
